From bc1d8ca01415710d40224de312c7ecf6f4223301 Mon Sep 17 00:00:00 2001
From: Philippe Proulx <eeppeliteloop@gmail.com>
Date: Mon, 6 Nov 2017 18:46:41 -0500
Subject: [PATCH] Fix: detect dlmopen() and disable corresponding tests if not
 available
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

musl and uClibc-ng are known not to support dlmopen(). LTTng-UST has
this dlmopen() detection.

Signed-off-by: Philippe Proulx <eeppeliteloop@gmail.com>
[Philippe: backport from upstream commit bc1d8ca0
           edited to remove .gitignore part]
Signed-off-by: Jérémie Galarneau <jeremie.galarneau@efficios.com>
---
 .gitignore                                 |  1 +
 configure.ac                               | 25 ++++++++++++++++++++++
 tests/regression/ust/ust-dl/prog.c         | 17 +++++++++++++--
 tests/regression/ust/ust-dl/test_ust-dl    | 32 ----------------------------
 tests/regression/ust/ust-dl/test_ust-dl.in | 34 ++++++++++++++++++++++++++++++
 tests/regression/ust/ust-dl/test_ust-dl.py |  9 +++++++-
 tests/utils/test_utils.py                  |  3 +++
 7 files changed, 86 insertions(+), 35 deletions(-)
 delete mode 100755 tests/regression/ust/ust-dl/test_ust-dl
 create mode 100644 tests/regression/ust/ust-dl/test_ust-dl.in

diff --git a/configure.ac b/configure.ac
index 016c56ec..b6ea39c5 100644
--- a/configure.ac
+++ b/configure.ac
@@ -196,6 +196,30 @@ AC_CHECK_FUNCS([ \
 # add -lrt to LIBS
 AC_CHECK_LIB([rt], [clock_gettime, timer_create, timer_settime, timer_delete])

+# Checks for dl.
+AC_CHECK_LIB([dl], [dlopen], [
+	have_libdl=yes
+	libdl_name=dl
+], [
+	# libdl not found, check for dlopen in libc.
+	AC_CHECK_LIB([c], [dlopen], [
+		have_libc_dl=yes
+		libdl_name=c
+	], [
+		AC_MSG_ERROR([Cannot find dlopen in libdl nor libc. Use [LDFLAGS]=-Ldir to specify their location.])
+	])
+])
+
+# Check if libdl has dlmopen support.
+AH_TEMPLATE([HAVE_DLMOPEN], ["Define to 1 if dlmopen is available."])
+AC_CHECK_LIB([$libdl_name], [dlmopen], [
+	AC_DEFINE([HAVE_DLMOPEN], [1])
+	HAVE_DLMOPEN=1
+], [
+	HAVE_DLMOPEN=0
+])
+AC_SUBST(HAVE_DLMOPEN)
+
 # Babeltrace viewer check
 AC_ARG_WITH([babeltrace-bin],
 	AS_HELP_STRING([--with-babeltrace-bin],
@@ -1100,6 +1124,7 @@ AC_CONFIG_FILES([
 AC_CONFIG_FILES([tests/regression/ust/python-logging/test_python_logging],[chmod +x tests/regression/ust/python-logging/test_python_logging])
 # Inject LTTNG_TOOLS_BUILD_WITH_LIBPFM variable in test script.
 AC_CONFIG_FILES([tests/perf/test_perf_raw],[chmod +x tests/perf/test_perf_raw])
+AC_CONFIG_FILES([tests/regression/ust/ust-dl/test_ust-dl],[chmod +x tests/regression/ust/ust-dl/test_ust-dl])

 AC_OUTPUT

diff --git a/tests/regression/ust/ust-dl/prog.c b/tests/regression/ust/ust-dl/prog.c
index e8e4b264..669792d9 100644
--- a/tests/regression/ust/ust-dl/prog.c
+++ b/tests/regression/ust/ust-dl/prog.c
@@ -13,7 +13,12 @@
  */
 int main(int argc, char **argv)
 {
-	void *h0, *h1, *h2, *h3, *h4;
+	void *h0, *h2, *h3, *h4;
+
+#ifdef HAVE_DLMOPEN
+	void *h1;
+#endif
+
 	char *error;
 	int (*foo)(void);

@@ -21,10 +26,14 @@ int main(int argc, char **argv)
 	if (!h0) {
 		goto get_error;
 	}
+
+#ifdef HAVE_DLMOPEN
 	h1 = dlmopen(LM_ID_BASE, "libfoo.so", RTLD_LAZY);
 	if (!h1) {
 		goto get_error;
 	}
+#endif
+
 	h2 = dlopen("libzzz.so", RTLD_LAZY);
 	if (!h2) {
 		goto get_error;
@@ -38,7 +47,7 @@ int main(int argc, char **argv)
 		goto get_error;
 	}

-	foo = dlsym(h1, "foo");
+	foo = dlsym(h3, "foo");
 	error = dlerror();
 	if (error != NULL) {
 		goto error;
@@ -49,9 +58,13 @@ int main(int argc, char **argv)
 	if (dlclose(h0)) {
 		goto get_error;
 	}
+
+#ifdef HAVE_DLMOPEN
 	if (dlclose(h1)) {
 		goto get_error;
 	}
+#endif
+
 	if (dlclose(h2)) {
 		goto get_error;
 	}
diff --git a/tests/regression/ust/ust-dl/test_ust-dl b/tests/regression/ust/ust-dl/test_ust-dl
deleted file mode 100755
index 1f2934db..00000000
--- a/tests/regression/ust/ust-dl/test_ust-dl
+++ /dev/null
@@ -1,32 +0,0 @@
-#!/bin/bash
-#
-# Copyright (C) - 2013 Jérémie Galarneau <jeremie.galarneau@efficios.com>
-#
-# This program is free software; you can redistribute it and/or modify it
-# under the terms of the GNU General Public License, version 2 only, as
-# published by the Free Software Foundation.
-#
-# This program is distributed in the hope that it will be useful, but WITHOUT
-# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
-# FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
-# more details.
-#
-# You should have received a copy of the GNU General Public License along with
-# this program; if not, write to the Free Software Foundation, Inc., 51
-# Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
-
-CURDIR=$(dirname $0)
-TESTDIR=${CURDIR}/../../..
-
-source $TESTDIR/utils/utils.sh
-
-if [ ! -x "$CURDIR/.libs/libfoo.so" ]; then
-	diag "No shared object generated. Skipping all tests."
-	exit 0
-fi
-
-start_lttng_sessiond_notap
-
-python3 ${CURDIR}/test_ust-dl.py
-
-stop_lttng_sessiond_notap
diff --git a/tests/regression/ust/ust-dl/test_ust-dl.in b/tests/regression/ust/ust-dl/test_ust-dl.in
new file mode 100644
index 00000000..61d00d21
--- /dev/null
+++ b/tests/regression/ust/ust-dl/test_ust-dl.in
@@ -0,0 +1,34 @@
+#!/bin/bash
+#
+# Copyright (C) - 2013 Jérémie Galarneau <jeremie.galarneau@efficios.com>
+#
+# This program is free software; you can redistribute it and/or modify it
+# under the terms of the GNU General Public License, version 2 only, as
+# published by the Free Software Foundation.
+#
+# This program is distributed in the hope that it will be useful, but WITHOUT
+# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+# FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
+# more details.
+#
+# You should have received a copy of the GNU General Public License along with
+# this program; if not, write to the Free Software Foundation, Inc., 51
+# Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+
+CURDIR=$(dirname $0)
+TESTDIR=${CURDIR}/../../..
+
+source $TESTDIR/utils/utils.sh
+
+if [ ! -x "$CURDIR/.libs/libfoo.so" ]; then
+	diag "No shared object generated. Skipping all tests."
+	exit 0
+fi
+
+export LTTNG_TOOLS_HAVE_DLMOPEN=@HAVE_DLMOPEN@
+
+start_lttng_sessiond_notap
+
+python3 ${CURDIR}/test_ust-dl.py
+
+stop_lttng_sessiond_notap
diff --git a/tests/regression/ust/ust-dl/test_ust-dl.py b/tests/regression/ust/ust-dl/test_ust-dl.py
index 81972a7d..72459840 100644
--- a/tests/regression/ust/ust-dl/test_ust-dl.py
+++ b/tests/regression/ust/ust-dl/test_ust-dl.py
@@ -31,6 +31,9 @@ sys.path.append(test_utils_path)
 from test_utils import *


+have_dlmopen = (os.environ.get('LTTNG_TOOLS_HAVE_DLMOPEN') == '1')
+
+
 NR_TESTS = 14
 current_test = 1
 print("1..{0}".format(NR_TESTS))
@@ -113,7 +116,11 @@ current_test += 1
 print_test_result(dlopen_event_found > 0, current_test, "lttng_ust_dl:dlopen event found in resulting trace")
 current_test += 1

-print_test_result(dlmopen_event_found > 0, current_test, "lttng_ust_dl:dlmopen event found in resulting trace")
+if have_dlmopen:
+    print_test_result(dlmopen_event_found > 0, current_test, "lttng_ust_dl:dlmopen event found in resulting trace")
+else:
+    skip_test(current_test, 'dlmopen() is not available')
+
 current_test += 1

 print_test_result(build_id_event_found > 0, current_test, "lttng_ust_dl:build_id event found in resulting trace")
diff --git a/tests/utils/test_utils.py b/tests/utils/test_utils.py
index 4b38630c..02e632a2 100644
--- a/tests/utils/test_utils.py
+++ b/tests/utils/test_utils.py
@@ -62,6 +62,9 @@ def print_test_result(result, number, description):
     result_string += " {0} - {1}".format(number, description)
     print(result_string)

+def skip_test(number, description):
+    print('ok {} # skip {}'.format(number, description))
+
 def enable_ust_tracepoint_event(session_info, event_name):
     event = Event()
     event.name = event_name
--
2.15.0

